/**
 * DATE:2025/10/14
 * AUTHOR: QI
 * DESCRIPTION: 手搓代码，删除暂时永不到的代码行。原始代码在parameter文件中
 */
package empty.dsa.util

import chisel3._
import chisel3.util._
/**
 * EleType: element type，列举可能用到的硬件元素
 */
object EleType extends Enumeration {
    type EleType = Value
    val  TYPE_ALU,
    TYPE_sha1,
    TYPE_DPM,
    TYPE_DPM_sha1,
    TYPE_IB,
    TYPE_OB,
    TYPE_IO,                            // IO是否有必要？
    TYPE_Multiplexer,
    TYPE_MultiplexerR,
    TYPE_Module = Value

    val eleTypeNum = this.values.size - 2 // 可能是为了去除了IO和Module,所以-2
}
/**
 * EleTypeFun: element type function 定义各种函数获取元素的元数据
 */
object EleTypeFun {
    /**
      * 获取元素类型的配置宽度
      * @param eleType
      * @param elePar
      * @return
      */
    def getEleCfgW (eleType : Int, elePar : List[Int]) : Int = {
        EleType(eleType) match {
            case EleType.TYPE_Multiplexer => log2Up(elePar(0))      // 输入参数为列表，列表的第一个元素（输入参数数量）取对数，例如输入参数数量为5，则返回3，意味着需要3bit配置信息用于多路选择
            case EleType.TYPE_MultiplexerR => log2Up(elePar(0))
            case EleType.TYPE_DPM => 7                              // 为什么DPM的配置宽度为7
            case EleType.TYPE_DPM_sha1 => 1
            case EleType.TYPE_sha1 => 1
            case EleType.TYPE_IB => 0
            case EleType.TYPE_OB => log2Up(elePar(0))
        }
    }
    /**
     * 获取元素类型名称
     * @param eleType 元素类型
     * @return 元素类型名称
     */
    def eleTypeName(eleType: Int): String = {
        EleType(eleType) match {
            case EleType.TYPE_ALU => "ALU"
            case EleType.TYPE_sha1 => "ALU"
            case EleType.TYPE_Multiplexer => "MUX"
            case EleType.TYPE_MultiplexerR => "MUXR"
            case EleType.TYPE_IB => "IB"
            case EleType.TYPE_OB => "OB"
            case EleType.TYPE_DPM => "DPM"
            case EleType.TYPE_DPM_sha1 => "DPM"
        } 
    }
    /**
     * 获取元素输入端口数量
     * @param eleType 元素类型
     * @param elePar 元素参数
     * @return 元素输入端口数量
     */
    def getEleInNum(eleType : Int, elePar : List[Int]) : Int = { 
        EleType(eleType) match {
            case EleType.TYPE_ALU => elePar(0)
            case EleType.TYPE_sha1 => elePar(0)
            case EleType.TYPE_Multiplexer => elePar(0)
            case EleType.TYPE_MultiplexerR => elePar(0)
            case EleType.TYPE_IB => 1
            case EleType.TYPE_OB => elePar(0)
            case EleType.TYPE_DPM => elePar(1)
            case EleType.TYPE_DPM_sha1 => elePar(0)
        }
    }
    /**
     * 获取元素输出端口数量
     * @param eleType 元素类型
     * @param elePar 元素参数
     * @return 元素输出端口数量
     */
    def getEleOutNum(eleType : Int, elePar : List[Int]) : Int = { 
        EleType(eleType) match {
            case EleType.TYPE_sha1 => 6
            case EleType.TYPE_Multiplexer => 1
            case EleType.TYPE_MultiplexerR => 1
            case EleType.TYPE_IB => 1
            case EleType.TYPE_OB => 1
            case EleType.TYPE_DPM => OpInfo.fuget(elePar(0)).map(OpInfo.getDPMoutNum(_)).max * elePar(3)
            case EleType.TYPE_DPM_sha1 => elePar(1)
        }
    }
    /**
     * 获取元素宽度
     * @param eleType 元素类型
     * @param elePar 元素参数
     * @return 元素宽度
     */
    def getEleWidth(eleType : Int, elePar : List[Int]) : Int = { 
        EleType(eleType) match {
            case EleType.TYPE_ALU => elePar(2)
            case EleType.TYPE_sha1 => elePar(2)
            case EleType.TYPE_Multiplexer => elePar(1)
            case EleType.TYPE_MultiplexerR => elePar(1)
            case EleType.TYPE_IB => elePar(0)
            case EleType.TYPE_OB => elePar(1)
            case EleType.TYPE_DPM => elePar(5)
            case EleType.TYPE_DPM_sha1 => elePar(2)
        }
    }
    /**
     * 获取元素端口名称
     * @param eleType 元素类型
     * @param isIn 是否为输入端口
     * @param num 端口编号
     * @return 端口名称
     */
    def getElePortName(eleType : Int, isIn : Boolean, num : Int) : String = { 
        eleType match {
            case _ => {
                if (isIn) {
                    "in" + num
                } else {
                    "out" + num
                }
            }
        }
    }
}
/**
 * Param: 参数
 */
object Param {
    val cfgDataW = 31
    val dataW = 32
    val pe_cfgwidth = 1
    val pe_cyclewidth = 7
}